package com.ycyoes.demos.concurrency.art.chapter4;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 线程优先级
 * 
 * @author ycyoes
 *
 */
public class Priority {
	private static volatile boolean notStart = true;
	private static volatile boolean notEnd = true;
	
	/**
	 * 从输出可看出线程优先级没有生效，优先级1和优先级10的Job计数的结果非常相近，没有明显差距
	 * 这表示程序正确性不能依赖线程的优先级高低
	 * @param args
	 * @throws InterruptedException
	 */
	public static void main(String[] args) throws InterruptedException {
		List<Job> jobs = new ArrayList<Priority.Job>();
		for (int i = 0; i < 10; i++) {
			int priority = i < 5 ? Thread.MIN_PRIORITY : Thread.MAX_PRIORITY;
			Job job = new Job(priority);
			jobs.add(job);
			Thread thread = new Thread(job, "Thread: " + i);
			thread.setPriority(priority);
			thread.start();
		}
		notStart = false;
		TimeUnit.SECONDS.sleep(10);
		notEnd = false;
		
		for(Job job : jobs) {
			System.out.println("Job Priority : " + job.priority + ", Count: " + job.jobCount);
		}
	}
	
	static class Job implements Runnable {
		private int priority;
		private long jobCount;
		public Job(int priority) {
			this.priority = priority;
		}
		public void run() {
			while (notStart) {
				Thread.yield();
			}
			while(notEnd) {
				Thread.yield();
				jobCount++;
			}
		}
	}
	
}
